// 异步相关的知识点

// 什么是异步？什么是同步？
// 异步是指多件事情可以同时进行。同步则相反，一件事情做完了才能做下一件事情。


// 如何实现异步
// 实现异步的方式有多线程和单线程非阻塞式

// 多线程：
// 线程是指进程中的任务，进程是指系统中的任务
// 线程不易过多，否则会影响性能

// 单线程非阻塞式：
// 同步代码先执行，遇到异步代码时，异步操作会放在事件队列中，等待同步执行完后去执行异步代码
// 分两步骤：步骤一：执行异步代码时先将其放在事件队列中；步骤二：等同步代码执行完后再执行异步操作。
// js就是采用单线程非阻塞式的异步机制
// setTimeout(function(){
//     console.log("timeout");
// },1000);
// let a = 0;
// a = 1;
// console.log('a',a);
// while(true){}

// 回调函数
// 异步方法中经常会使用到回调函数来实现异步操作
// 异步方法中会用到回调函数，但并不意味着所有的回调函数都是异步
// 回调地狱：大量的回调函数嵌套导致阅读和修改变得困难

// function show(func){
//     func();
// }
// show(function(){
//     console.log("callback");
// });
// console.log("go on");
// console.log("end");
// setTimeout(function(){
//     console.log("first");
//     setTimeout(function(){
//         console.log("second");
//         setTimeout(function(){
//             console.log("third");
//         },1000);
//     },1000)
// },1000)


// console.log("go on");
// console.log("end");

// 解决回调地狱的方法：使用Promise对象
// Promise是ES6新推出的一个实现异步的对象，可以自定义异步方法
// let promise = new Promise(function(resolve,reject){
//     resolve();
// });
// promise.then(function(){
//     console.log("promise异步");
// });
// console.log("go on");
// console.log("end");

// 用Promise对象解决回调地狱
function timeout(){
    return new Promise(function(resolve){
        setTimeout(function(){
            resolve('hello');
        },1000);
    })
}
// timeout().then(function(){
//     console.log("first");
//     return timeout();
// }).then(function(){
//     console.log("second");
//     return timeout()
// }).then(function(){
//     console.log("thrid");
// });
// console.log("go on");
// console.log("end");

// ES7提供了async和await简化异步代码
// async、await只是Promise对象的语法糖
// await后面跟着的一定是Promise对象
// 当函数中用了await，函数声明时必须添加async

async function show(){
    let data = await timeout();
    console.log("first",data);
    await timeout();
    console.log("second");
    await timeout();
    console.log("third");
}
show();
console.log("go on");
console.log("end");

// webpack打包器
// webpack核心功能就是将各个模块打包